package com.yzs.base.utils

import android.app.Application
import android.os.Parcelable
import com.tencent.mmkv.MMKV
import java.util.*

/**
 * author : yzs
 * time   : 2021/07/07
 * desc   : MMKV
 */
object SpUtils {
    private lateinit var mmkv: MMKV

    /**
     * 初始化 不做进程区分初始化
     */
    fun init(application: Application) {
        MMKV.initialize(application)
        mmkv = MMKV.defaultMMKV()
    }


    /**
     * 存储基本类型
     */
    fun encode(key: String, value: Any?) {
        when (value) {
            is String -> mmkv.encode(key, value)
            is Float -> mmkv.encode(key, value)
            is Boolean -> mmkv.encode(key, value)
            is Int -> mmkv.encode(key, value)
            is Long -> mmkv.encode(key, value)
            is Double -> mmkv.encode(key, value)
            is ByteArray -> mmkv.encode(key, value)
            is Nothing -> return
        }
    }

    /**
     * 存储 Parcelable 序列化类型
     */
    fun <T : Parcelable> encode(key: String, t: T?): Boolean {
        if (t == null) {
            return false
        }
        return mmkv.encode(key, t)
    }

    /**
     * 存储 Set<String>? 类型
     */
    fun encode(key: String, sets: Set<String>?): Boolean {
        if (sets == null) {
            return false
        }
        return mmkv.encode(key, sets)
    }

    /**
     * 获取 Int 类型 默认值 0
     */
    fun decodeInt(key: String, defaultValue: Int = 0): Int {
        return mmkv.decodeInt(key, defaultValue)
    }

    /**
     * 获取 Double 类型 默认值 0.00
     */
    fun decodeDouble(key: String, defaultValue: Double = 0.00): Double {
        return mmkv.decodeDouble(key, defaultValue)
    }

    /**
     * 获取 Long 类型 默认值 0L
     */
    fun decodeLong(key: String, defaultValue: Long = 0L): Long {
        return mmkv.decodeLong(key, defaultValue)
    }

    /**
     * 获取 Boolean 类型 默认值 false
     */
    fun decodeBoolean(key: String, defaultValue: Boolean = false): Boolean {
        return mmkv.decodeBool(key, defaultValue)
    }

    /**
     * 获取 Float 类型 默认值 0.0F
     */
    fun decodeFloat(key: String, defaultValue: Float = 0.0F): Float {
        return mmkv.decodeFloat(key, defaultValue)
    }

    /**
     * 获取 ByteArray 类型
     */
    fun decodeByteArray(key: String): ByteArray? {
        return mmkv.decodeBytes(key)
    }

    /**
     * 获取 String 类型 默认值 ""
     */
    fun decodeString(key: String, defaultValue: String = ""): String? {
        return mmkv.decodeString(key, defaultValue)
    }

    /**
     * 获取 Parcelable 类型的 bean 类
     */
    fun <T : Parcelable> decodeParcelable(key: String, tClass: Class<T>): T? {
        return mmkv.decodeParcelable(key, tClass)
    }

    /**
     * 获取 Set<String>? 类型 默认值是 emptySet()
     */
    fun decodeStringSet(key: String): Set<String>? {
        return mmkv.decodeStringSet(key, Collections.emptySet())
    }

    /**
     * 根据 key 移除
     */
    fun removeKey(key: String) {
        mmkv.removeValueForKey(key)
    }

    /**
     * 清除所有的 key value
     */
    fun clearAll() {
        mmkv.clearAll()
    }

}